 /**
 * 文件名称: hardware_rtc.c
 * 摘    要: linux应用程序下操作硬件rtc源文件
 * 来    源: 自我总结
 *
 * 当前版本: 1.0
 * 作    者: huenrong
 * 完成日期: 2019年06月13日
 **/


#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>

#include "hardware_rtc.h"


/************************************************************************
函数名称: hardware_rtc_read_date_time
函数功能: 硬件rtc读取日期和时间
函数参数: path_name: 需需要打开的RTC设备路径(形如: /dev/rtc0)
          read_date_time: 读取到的日期和时间(读取到的年和月分别需要加上1900和1才是当前时间)
函数返回: 成功: 返回0
          失败: 返回-1
************************************************************************/
int hardware_rtc_read_date_time(const char *path_name, struct rtc_time *read_date_time)
{
    int fd = -1;
    int ret = -1;

    fd = open(path_name, O_RDONLY);     // 以只读方式打开RTC设备文件
    if (-1 == fd)
    {
        perror("hardware_rtc_read_date_time open rtc failed");

        return -1;
    }

    ret = ioctl(fd, RTC_RD_TIME, read_date_time);
    if (-1 == ret)
    {
        perror("hardware_rtc_read_date_time read rtc failed");
        close(fd);

        return -1;
    }

    close(fd);

    return 0;
}

/************************************************************************
函数名称: hardware_rtc_set_date_time
函数功能: 硬件rtc设置日期和时间
函数参数: path_name: 需需要打开的RTC设备路径(形如: /dev/rtc0)
          set_date_time: 需要设置的日期和时间
          sync_flag: 同步系统时间标志(0: 不同步硬件时间到系统时间; 1: 同步硬件时间到系统时间)
函数返回: 成功: 返回0
          失败: 返回-1
************************************************************************/
int hardware_rtc_set_date_time(const char *path_name, const struct rtc_time set_date_time, const unsigned char sync_flag)
{
    int fd = -1;
    int ret = -1;

    fd = open(path_name, O_WRONLY);     // 以只写方式打开RTC设备文件
    if (-1 == fd)
    {
        perror("hardware_rtc_set_date_time open rtc failed");

        return -1;
    }

    ret = ioctl(fd, RTC_SET_TIME, &set_date_time);
    if (-1 == ret)
    {
        perror("hardware_rtc_set_date_time write rtc failed");
        close(fd);

        return -1;
    }

    close(fd);

    if (1 == sync_flag)
    {
        system("hwclock -s");       // 设置RTC时间完成后, Set system time from hardware clock
    }

    return 0;
}


